<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 单例模式核心代码
        
        */

        // 设计模式  

        // 思想  
        // 针对 特定的问题 给出的简洁 优化的解决方案   


        // 单例 

        // 一个构造函数 一生只能创造一个实例 

        // 如何保证一生只能创造一个实力 

        // new 构造函数/类名() 创建一个示例
        // 想办法让 new 构造函数/类名()仅仅执行一次  

        // 如何仅仅执行一次 


        // class Person{
        //     constructor(){  // new 执行一次  constructor() 也执行一次

        //     }
        // }
        // let instance = null;
        // function singleton(){
        //     if(!instance){   // 只有一次走进if的可能 
        //         instance = new 构造函数类名();
        //     }
        // }



        // 问题1: instance 暴露在全局 有污染的风险
        // 问题2: 实例化对象 传参改变无效 
        // 问题3: 完全可以绕开 singleton实例化对象  可以创建多个对象 单例失效

        // class Person{
        //     constructor(name){  
        //         this.name = name;
        //     }

        // }

        // const singleton =  (function(){
        //     let instance = null;
        //     function inner(str){
        //         if(!instance){   // 只有一次走进if的可能 
        //             instance = new Person(str);
        //         }

        //         return instance
        //     }
        //     return inner;
        // })()

        // // singleton   inner
        // console.log(singleton('张三'));
        // console.log(singleton('张三1'));
        // console.log(singleton('张三2'));



        // 问题2

        // class Person{
        //     constructor(){  
        //         this.name = '无名氏';
        //     }


        //     run(val){ // 每次实例化都执行run方法  才能每次改对象的属性 
        //         this.name = val;
        //     }
        // }

        // const singleton =  (function(){
        //     let instance = null;
        //     function inner(str){
        //         if(!instance){   // 只有一次走进if的可能 
        //             instance = new Person();
        //         }
        //         // 想要解决每次传参有效果 就得每次执行run方法  
        //         // if仅仅执行1次 
        //         // 所以放到if外边 
        //         instance.run(str)
        //         return instance
        //     }
        //     return inner;
        // })()

        // // singleton   inner
        // const p1 = singleton('张三');
        // console.log(p1);
        // const p2 = singleton('张三1');
        // console.log(p2);
        // const p3 = singleton('张三2');
        // console.log(p3);

        // 问题3 :完全可以绕开 singleton 
        // 把类也放到 singleton中 不得不走singleton 
        const Person = (function () {
            class Person {
                constructor() {
                    this.name = '无名氏';
                    this.init();
                }
                init(){
                    this.one();
                    this.two();
                }

                one(){

                }

                two(){

                }

                run(val) {
                    this.name = val;
                }
            }
            let instance = null;
            function inner(str) {
                if (!instance) {   // 只有一次走进if的可能 
                    instance = new Person();
                }
                instance.run(str)
                return instance
            }
            return inner;
        })()


        const p1 = new Person('龙飞');
        console.log(p1);
        const p2 = new Person('蕊')
        console.log(p2);
        const p3 = new Person('雪')
        console.log(p3);


        // 项目中哪些地方用到单例模式?
        // 1.封装弹框\模态框组件 
        // 2.封装连接数据库类 


    </script>
</body>

</html>